package com.cg.leetcode;

import org.junit.Test;

/**
 * 541.反转字符串 II
 *
 * @author cg
 * @program LeetCode->LeetCode_541
 * @create 2022-07-20 09:30
 **/
public class LeetCode_541 {

    @Test
    public void test() {
        System.out.println(reverseStr("abcdefg", 1));
        System.out.println(reverseStr("abcdefg", 2));
        System.out.println(reverseStr("abcdefg", 3));
        System.out.println(reverseStr("abcdefg", 8));
        System.out.println(reverseStr("abcd", 2));
        System.out.println(reverseStr("hyzqyljrnigxvdtneasepfahmtyhlohwxmkqcdfehybknvdmfrfvtbsovjbdhevlfxpdaovjgunjqlimjkfnqcqnajmebeddqsgl", 39));
    }

    /**
     * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
     * 如果剩余字符少于 k 个，则将剩余字符全部反转。
     * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
     * <p>
     * 示例 1：
     * 输入：s = "abcdefg", k = 2
     * 输出："bacdfeg"
     * <p>
     * 示例 2：
     * 输入：s = "abcd", k = 2
     * 输出："bacd"
     * <p>
     * 提示：
     * 1 <= s.length <= 10^4
     * s 仅由小写英文组成
     * 1 <= k <= 10^4
     *
     * @param s
     * @param k
     * @return
     */
    public String reverseStr(String s, int k) {
        int n = s.length();
        char[] chars = s.toCharArray();
        for (int i = 0; i < n; i += 2 * k) {
            // 这里是判断尾数够不够k个来取决right指针的位置
            int left = i, right = Math.min(i + k, n) - 1;
            while (left < right) {
                char temp = chars[left];
                chars[left++] = chars[right];
                chars[right--] = temp;
            }
        }
        return new String(chars);
    }

}
